// 基于axios封装网络请求
// 每个程序员的想法都不一样，封装的地方和名字都不一样，但是思想相同
import theAxios from 'axios'
import { Notify } from 'vant'
import router from '@/router'
import { getToken } from '@/utils/token.js'
const axios = theAxios.create({
  baseURL: 'http://geek.itheima.net',
  timeout: 20000 // 20秒超时时间（请求20秒无响应直接判断判断超时）
})
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
  // http响应状态码为2xx或者3xx就进入这里
  // 对响应数据做点什么
  // console.log(config)
  if (getToken()?.length > 0 && config.headers.Authorization === undefined) {
    config.headers.Authorization = `Bearer ${getToken()}`
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  // 对http响应状态码4xx，5xx报错进入这里
  // console.dir(error)
  return Promise.reject(error)
})

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  return response
}, function (error) {
  // 对响应错误做点什么
  // 只有401才代表身份过期。才需要跳转登录
  if (error.response.status === 401) {
    // 不能使用this.$router(因为this不是vue组件对象无法调用$router)
    router.replace('/login')
    Notify({ type: 'warning', message: '身份已过期' }) // 提示框
  }
  return Promise.reject(error)
})

// 较为高级的写法
export default ({ url, method = 'GET', params = {}, data = {}, headers = {} }) => {
  return axios({
    url,
    method,
    params,
    data,
    headers
  })

  // return new Promise((resolve, reject) => {
  //   // 判断如果params有值,需要自己写代码，把params对象里key和value拼接到url上
  //   $ajax({
  //     url,
  //     data,
  //     headers,
  //     type: method,
  //     success: (res) => {
  //       resolve(res)
  //     },
  //     error: err => {
  //       console.log(err)
  //     }
  //   })
  // })
}
